<?php

namespace app\admin\model;
use Think\Db;
use think\Model;

/**
 * 文件操作类
 * 控制附件的上传 下载 显示 列表等
 * @author lrenwang
 *
 */
class Files extends Model
{

    /**
     * 文件的目录,最好放在根目录 如果可以,最好直接用 '/upload/'
     *
     * @var string
     */
    static public $file_dir = 'upload/';

    /**
     * 内容id
     *
     * @var unknown_type
     */
    static public $aid = '';

    /**
     * 文件上传
     *
     * @param string $name 		上传文件的file name名称,可以是 "upload[]"形式
     * @param string $file_rand	如果是批量上传,用一个唯一编号做关联
     * @param string $user		上传者
     * @param string $type		附件分类
     * @return array	传递一个,返回id,传递多个返回数组
     */
    public function upload($name, $file_rand = '', $type = 0, $user = '', $aid)
    {
        //读取配置
        self::$file_dir = 'upload/';
        self::$aid      = $aid;

        $tmp = array();
        if (is_array($_FILES[$name]['name']))
        {
            for ($i = 0; $i < count($_FILES[$name]['name']); $i++)
            {
                if (empty($_FILES[$name]['name'][$i]))
                    continue;


                $array             = array();
                $array['name']     = $_FILES[$name]['name'][$i];
                $array['type']     = $_FILES[$name]['type'][$i];
                $array['tmp_name'] = $_FILES[$name]['tmp_name'][$i];
                $array['error']    = $_FILES[$name]['error'][$i];
                $array['size']     = $_FILES[$name]['size'][$i];
                $tmp[]             = self::_upload($array, $file_rand, $type, $user);
            }
        }
        else
        {
            $tmp = self::_upload($_FILES[$name], $file_rand, $type, $user);
        }
        return $tmp;
    }

    public function _upload($array, $file_rand, $type, $user)
    {
        //随机ID
        $rand_id  = date('YmdHis') . mt_rand(1000, 9999);
        //扩展名
        $ext_name = pathinfo($array['name'], PATHINFO_EXTENSION);

        //文件的相对目录
        $file_tmp_dir = self::$file_dir . date('Ym') . '/';

        //如果实际目录不存在,则创建
        if (!is_dir($file_tmp_dir))
            mkdir($file_tmp_dir, 0777, true);

        //文件的相对位置
        $file_tmp_name = $file_tmp_dir . $rand_id . '.' . $ext_name;
        //文件实际位置
        $new_file      = $file_tmp_name;
        if (move_uploaded_file($array['tmp_name'], $new_file))
        {
            $data=[
                'file_name'     => $array['name'],
                'rand_id'       => $rand_id,
                'file_ext'      => strtolower($ext_name),
                'file_type'     => $array['type'],
                'file_time'     => date('Y-m-d H:i:s'),
                'file_url'      => "/" . $file_tmp_name,
                'file_size'     => $array['size'],
            ];
            $this->save($data);
            return $rand_id;
        }
        else
        {
            exit('临时文件:' . $array['tmp_name'] . '- 新文件:' . $new_file . ' move error');
        }
    }

    /**
     * 获得文件信息
     *
     * @param str $rand_id
     * @return bool
     */
    public function detail($rand_id)
    {
//        $m          = new core;
//        $m->rand_id = $rand_id;
//        $m->select(Table(__CLASS__));
        $m = $this->where('rand_id',$rand_id)->find();
        return $m;
    }

    public function detail_id($id)
    {
//        $m     = new core;
//        $m->id = $id;
//        $m->select(Table(__CLASS__));
        $m = $this->where('rand_id',$rand_id)->find();
        return $m;
    }

    /**
     * 根据随机名下载
     *
     * @param string $randName
     */
    final static function download($rand_id)
    {
        $mes = self::detail($rand_id);
        if (empty($mes))
        {
            exit('File does not exist');
        }

        $name = iconv("UTF-8", "GB2312//IGNORE", $mes->file_name);
        Header("Content-type: {$type} ; charset=utf-8");        //输出类型
        Header("Content-Disposition:filename={$name}");
        Header("Accept-Ranges: bytes");            //文件单位
        Header("Accept-Length: {$mes->file_size}");         //文件大小
        Header("Content-Disposition: attachment; filename={$name}");    //下载时显示的名字
        $file = fopen($mes->file_url, "r");     // 打开文件
        echo fread($file, $mes->file_size);
        fclose($file);
        exit;
    }

}

